/**
 * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
 * 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下:
 *  P   A   H   N
    A P L S I I G
    Y   I   R
  之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。
  请你实现这个将字符串进行指定行数变换的函数：
  string convert(string s, int numRows);
  https://leetcode-cn.com/problems/zigzag-conversion/
*/

/* 
 * 方式一, 高赞的解法
定义一个数组
遍历字符串, 把每次得到字符通过 规则拼接到数组字符串中 
res[i] += c 把每个字符填充对应行si
i += flag 更新当前行索引
flag = -flag 到达转折点时候执行反向
将得到的数组转为字符串
*/

/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}

var convert = function(s, numRows) {
  if (numRows < 2) return s
  let resArr = [], i = 0, flag = -1
  for (; i < numRows; i++) {
    resArr[i] = ""
  }
  i = 0
  s.split('').forEach((char) => {
    resArr[i] += char
    if (i === 0 || i === numRows - 1) flag = -flag
    i += flag
  })
  return resArr.join("")
};



var convert = function(s, numRows) {
  if (numRows < 2) return s
  let resArr = [], i = 0, flag = -1
  resArr = new Array(numRows).fill("")
  for (let char of s) {
    resArr[i] += char
    if (i === 0 || i === numRows - 1) flag = -flag
    i += flag
  }
  return resArr.join("")
};
// PINALSIGYAHRPI
console.log(convert("PAYPALISHIRING", 4))
*/
/**
 * 方式二 根据数组下标来判断
我们先假定有 numRows=4 行来推导下，其中 2*numRows-2 = 6 , 我们可以假定为 step=2*numRows-2 ，我们先来推导下规则：
第0行： 0 - 6 - 12 - 18
==> 下标间距 6 - 6 - 6 ==> 下标间距 step - step - step
第1行： 1 - 5 - 7 - 11 - 13
==> 下标间距 4 - 2 - 4 - 2 ==> 下标间距 step-2*1(行)-2*1(行)-step-2*1(行)-2*1(行)
第2行： 2 - 4 - 8 - 10 - 14
==> 下标间距 2 - 4 - 2 - 4 ==> 下标间距step-2*2(行)-2*2(行)-step-2*2(行)-2*2(行)
第3行：3 - 9 - 15 - 21
==> 下标间距间距 6 - 6 - 6 ==>下标间距 step - step - step
可以得出以下结论：
起始下标都是行号
第0层和第numRows-1层的下标间距总是 step 。
中间层的下标间距总是step-2*行数，2*行数交替。
下标不能超过len(s)-1
*/
var convert = function(s, numRows) {
  if (numRows < 2) return s
  let step = 2 * numRows -2, i = 0, sLength = s.length, add = 0, ret = '', index = 0
  for(; i < numRows; i++) {
    index = i
    add = i * 2 // 计算下标间距
    while (index < sLength) { // 超出字符串长度计算下一层
      ret += s[index]
      add = step - add // 6 - 2 = 4, 6 - 4 = 2, 6 - 2 =4
      index += (i === 0 || i === numRows -1) ? step : add
    }
  }
  return ret
};
console.log(convert("PAYPALISHIRING", 4))